import jwt
from flask import current_app
from jwt import PyJWTError
from comment.models.user import User
from comment.utils.const import SECRET_KEY, JWT_EXPRISON_TIMEOUT
from datetime import datetime, timedelta


def generate(uid):
    """
    生成密钥
    :param uid:
    :return:
    """
    pyload = {
        'id': uid,
        # 超时时间 必须使用下面这种格式
        'exp': datetime.utcnow() + timedelta(seconds=JWT_EXPRISON_TIMEOUT)
    }
    # 三个参数 参数一:pyload:id和过期时间 参数二：密钥 参数三：加密算法名称 使用HS进行加密
    s = jwt.encode(payload=pyload, key=SECRET_KEY, algorithm='HS256')  # 返回的是一个16位的随机数
    return s


def check_uid(token_str):
    """
    验证token，并且返回用户当前的id，以便于后面进行token的验证
    :return:
    """
    try:
        # 解密后的数据 三个参数：传进来的token值  key:密钥  参数三: 算法名称
        data = jwt.decode(token_str, key=SECRET_KEY, algorithms='HS256')
    except PyJWTError as e:
        current_app.logger.info(e)
        return {'message': 'token验证失败'}
    # 如果token验证成功，还需要检查用户的状态是否正常
    # 获取当前用户
    user = User.query.filter(User.id == data['id']).first()
    if user and user.status != 0:
        return {'message': '数据库中的状态用户过期'}
    return {'id': user.id}
